home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Personal Computer World 2006 May
/
PCWMAY06.iso
/
Software
/
Trial
/
ConceptDraw NetDiagrammer
/
data1.cab
/
Samples__Basic
/
SimpleDrawing
/
DrawDiagrams
/
DrawDiagram.cdb
next >
Wrap
Text File
|
2006-02-08
|
5KB
|
82 lines
Sub DrawDiagram()
Const Pi As Double = 3.14159265 'Определение константы Pi
Const cdStep As Double = Pi/20 'Задание шага изменения координаты X при построении графика
Const PiDiv2Neig As Double = Pi/2 - cdStep 'Нижняя окрестность точки Pi/2, используется при построении графика функции y=tn(x) для изоляции точки разрыва
Const X0 As Double = 1000 'Абсцисса центра координат графика.
Const Y0 As Double = 1500 'Ордината центра координат графика.
Const cdScale As Double = 200 'Масштаб строящегося графика. Единица шкалы графика соответствует 200 юнитам документа.
Dim active_page As Page 'Ссылка на активную страницу нового документа.
Dim new_Shape As Shape 'Ссылка на объект-шэйп, представляющий новую построенную диаграмму.
Dim dX As Double 'Координата X следующей определяющейся точки диаграммы.
'Получаем ссылку на активную страницу текущего документа. Используем глобальную переменную thisDoc
'для доступа к объекту Document.
Set active_page = thisDoc.ActivePage
'Получаем количество шэйпов на активной странице активного документа
iShapesCount = active_page.ShapesNum()
'Очищаем страницу документа от всех шэйпов, не находящихся на Layer "Axis".
'Выполняем цикл для всех шэйпов страницы. При инициализации
'значение счетчика становится равным количеству шэйпов на активной странице
'активного документа. Затем значение счетчика уменьшается до 1 с шагом -1.
'Если бы значение счетчика изменялось от 1 до iShapesCount, после удаления
'шэйпа происходила бы переиндексация остальных объектов, и обращения к объектам
'по уже несуществующему индексу.
For i=iShapesCount To 1 Step -1
'Если шэйп не находится на Layer "Axis", удаляем его.
If thisDoc.LayerByID(active_page.Shape(i).Layer).Name <> "Axis" Then
active_page.RemoveShape(i)
End If
Next
'Начинаем построение графика. График аппроксимируется полигоном.
'Строим один период [-Pi;Pi] периодической функции.
Set new_Shape = active_page.BeginShape()
'Устанавливаем графику ширину линии и цвет, используя индексное представление цвета.
new_Shape.PenWeight = 8
new_Shape.PenColor.Index = 1
'Определяем первую точку графика.
active_page.MoveTo(X0 - Pi* cdScale, Y0 - sin(-Pi)* cdScale)
For dX=-Pi To Pi Step cdStep
'Строим сегменты полигона. При этом следует учесть, что ось ординат графика направлена
'противоположно оси ординат документа.
active_page.LineTo(X0 + dX*cdScale, Y0 - sin(dX)*cdScale)
Next
'Завершаем построение шэйпа.
active_page.EndShape()
'Аналогично строим график функции y=cos(x)
Set new_Shape = active_page.BeginShape()
new_Shape.PenWeight = 8
new_Shape.PenColor.Index = 12
active_page.MoveTo(X0 - Pi*cdScale, Y0 - cos(-Pi)*cdScale)
For dX=-Pi To Pi Step cdStep
active_page.LineTo(X0 + dX*cdScale, Y0 - cos(dX)*cdScale)
Next
active_page.EndShape()
'Построение графика функции y=arctn(x) на промежутке [-Pi;Pi]
Set new_Shape = active_page.BeginShape()
new_Shape.PenWeight = 8
new_Shape.PenColor.Index = 3
active_page.MoveTo(X0 - Pi*cdScale, Y0 - atn(-Pi)*cdScale)
For dX=-Pi To Pi Step cdStep
active_page.LineTo(X0 + dX*cdScale, Y0 - atn(dX)*cdScale)
Next
active_page.EndShape()
'Построение графика функции y=tn(x). Эта функция периодическая с периодом Pi.
'Поскольку значение функции стремиться к бесконечности при x, стремящемся к -Pi/2 и Pi/2,
'график строится только на промежутке [-PiDiv2Neig;PiDiv2Neig].
Set new_Shape = active_page.BeginShape()
new_Shape.PenWeight = 8
new_Shape.PenColor.Index = 5
active_page.MoveTo(X0 - PiDiv2Neig * cdScale, Y0 - tan(-PiDiv2Neig)*cdScale)
For dX=-PiDiv2Neig To PiDiv2Neig Step cdStep
active_page.LineTo(X0 + dX*cdScale, Y0 - tan(dX)*cdScale)
Next
active_page.EndShape()
End Sub